#!/usr/bin/perl
use Term::ANSIColor;
use Term::ANSIColor qw(:constants);

$ultimosN = -1;
$stringBuscada = "";
$fechaBuscada = "";
$tipoBuscado = "";
$usuarioBuscado = "";

$comando = @ARGV[0];

#Obtengo la dirección del archivo de log
#HIPOTESIS: el path me viene con la / al final!!
$dir = getEnvVariable("LOGDIR");
if(!$dir){
  $dir = getEnvVariable("GRUPO");
  $dir.= "logdir/";
}

#Nombre del archivo a escribir
$dir.= "$comando";

#obtengo la extension del archivo de log
$ext = getEnvVariable("LOGEXT");
if(!$ext){
  $ext = ".log";
}
$dir.= $ext;

#leo los parámetros adicionales
$index = 1;
foreach( @ARGV ){

  chomp($_);

# Ultimos N mensajes
  if( $_ =~ m/^-[0-9]+/s && $ultimosN == -1){
    $ultimosN = substr($_,1);
  }

# String que se quiere buscar
  if( $_ eq "-q" ){
    $stringBuscada = @ARGV[$index];
# Escapeo el separador del archivo
    $stringBuscada =~ s/-/\\\\-/g;
  }

# Tipo de mensaje buscado
  if( $_ eq "-t" ){
    $tipoBuscado = @ARGV[$index];
  }

# Usuario Buscado
  if( $_ eq "-u" ){
    $usuarioBuscado = @ARGV[$index];
  }

# Fecha buscada
  if( $_ eq "-d" ){
    $fechaBuscada = @ARGV[$index];
  }

# Imprime la ayuda
  if( $_ eq "--help" ){
    printHelp();
    exit(0);
  }
  $index++;
}


#Abro el log
open(LOG,"<$dir") || die "ERROR: no existe el log: $dir\n";
@backLines = reverse <LOG>;
close(LOG);

#Copio los ultimos N mensajes que apliquen segun los filtros
  $i = 0;
  foreach( @backLines ){
    $add = "true";
    
#   La busqueda por string no es case sensitive
    if($stringBuscada ne ""){
      if($_ !~ m/^.{8} .{8}-.*-.*-.*-.*$stringBuscada.*/i){
        $add = "false";
      }
    }

    if($fechaBuscada ne ""){
      if($_ !~ m/^$fechaBuscada /){
        $add = "false";
      }
    }

    if($tipoBuscado ne ""){
      if($_ !~ m/^.{8} .{8}-.*-.*-$tipoBuscado/){
        $add = "false";
      }
    }

    if($usuarioBuscado ne ""){
      if($_ !~ m/^.{8} .{8}-$usuarioBuscado-/){
        $add = "false";
      }
    }

    if($add eq "true"){
      $_ =~ s/\\-/-/g;
      unshift(@salida, $_);
      $i++;
    }
    last if ($i == $ultimosN )
  }

  foreach(@salida){
    chomp($_);
    $color = definirColor("$_");
    print color("$color"), "$_", color("reset"), "\n";
  }

#----------------------------------------------------------------------------------------------------------------------
#SUBRUTINAS
#----------------------------------------------------------------------------------------------------------------------
#Subrutnina que recibe el nombre de una variable de ambiente del bash y devuelve su valor 
sub getEnvVariable{
  my $envVar = `env | grep $_[0]= | sed s/^$_[0]=//`;
  chomp($envVar);
  return $envVar;
}

sub printHelp{
  print "Uso: MirarT [Nombre del Comando] [Filtros]
    -n			Muestra los últimos n mensajes del log
    -q [busqueda]	Texto a buscar. No es case sensitive
    -t [tipo]		Filtra por tipo de mensaje
    -u [usuario]	Filtra por usuario
    -d [YYYYMMDD]	Filtra por fecha
    --help		Imprime la ayuda\n";
}

sub definirColor{
  #Rojo si es error (E)
  if($_[0] =~ m/^.{8} .{8}-.*-.*-E/){
    return "red";
  }
  #Rojo si es error severo (SE)
  if($_[0] =~ m/^.{8} .{8}-.*-.*-SE/){
    return "white on_red";
  }
  #Amarillo si es advertencia (A)
  if($_[0] =~ m/^.{8} .{8}-.*-.*-A/){
    return "bright_yellow";
  }
  #Verde si es informativo (I)
  if($_[0] =~ m/^.{8} .{8}-.*-.*-I/){
    return "bright_green";
  }
  #Blanco en otros casos
  return "reset";
}
